package com.algorithms.absdatatypes;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;

import com.algorithms.absdatatypes.AbstractGraph.GraphEntry;


public interface Graph<K extends Comparable,T,NM extends Number> extends Container
{
	/*
	 * Get all the vertices of the graph
	 */
    public Set<GraphNode<K,T>> getVertices();
    
    /*
	 * Get all the vertices of the graph
	 */
    public Map<GraphNode<K,T>,GraphNode<K,T>> getEdges();
    
	 /*
	  * * Add  Edges to the graph
	 */
    //public void addEdge(GraphNode<K,T> vertex1,GraphNode<K,T> vertex2,Apply.GRAPH_EDGE_DIRECTION direction);
    /*
	  * * Add  Edges to the graph with weight
	 */
   public void addEdge(GraphNode<K,T> vertex1,GraphNode<K,T> vertex2, NM weight,Apply.GRAPH_EDGE_DIRECTION direction);
   
    /*
	 * Remove  vertices to the graph
	 */
    public void addVertex(GraphNode<K,T> vertex1);
    
    /*
	 * Remove  Edges to the graph
	 */
    public void removeEdge(GraphNode<K,T> vertex1,GraphNode<K,T> vertex2,Apply.GRAPH_EDGE_DIRECTION direction);
    /*
	 * Add  vertices to the graph
	 */
    public void removeVertex(GraphNode<K,T> vertex);
    
    /*
	  * * Add  Edges to the graph
	 */
   //public void addEdge(K vertex1,K vertex2,Apply.GRAPH_EDGE_DIRECTION direction);
   /*
	  * * Add  Edges to the graph with weight
	 */
   public void addEdge(K vertex1,K vertex2,NM weight,Apply.GRAPH_EDGE_DIRECTION direction);
 
   /*
	 * Remove  vertices to the graph
	 */
   public void addVertex(K vertex1);
   
    
	 /*
	  * * Add  Edges to the graph with weight
	 */
	 public void addEdges(LinkedHashMap<K,K> hashMap, LinkedList<NM> weightList, Apply.GRAPH_EDGE_DIRECTION direction);
	 
	 /*
	  * * Add  Edges to the graph with weight
	 */
	 public void addEdges(K[] keyArray1, K[] keyArray2,NM[] weightArray ,Apply.GRAPH_EDGE_DIRECTION direction);
	 
	 /*
		 * Remove  vertices to the graph
		 */
	 public void addVertices(List<K> vertices);
	 
	 public void addVertices(K[] vertices);
	 
	 public  LinkedHashMap<GraphNode<K,T>, LinkedList<GraphEntry<GraphNode<K, T>, NM>>> getAdjacencyList();
	 
	 public Apply.GRAPH_DIRECTION getGraphType();
	 
}
